אז פתחתי את הדף עם הקוד שכתוב למטה וסגרתי אותו בדיוק מאית שניה אחרי
do{
sleep(2);
print "\n";flush();ob_flush();
$c++;
sleep(1);
if(connection_status()!=0)die;
$m->query("UPDATE try SET cycle=$c WHERE id=0");}while(true);
אך הבעיה היא שהדף עובר פעמיים את WHILE ורק אז הוא מביין כי הדף נסגר
(במסד הCYCLE מראה על "2")
הקוד שכתבתי מכיל פעמיים OB_FLUSH מכיוון שרק בדרך זו הCYCLE שווה ל2 ולא לשלוש..
המטרה: לזהות ב1 סיבובים כי הדף נסגר
12 תשובות
מה זאת אומרת אי אפשר
סתם לידע כללי גם אם אני שם
ויוצא אחרי מאית שניה מהדף זה עדיין עובר 2 סיבובים ..
אפילו ניסיתי לחלק את ה30 ל3 ואז FLUSH וכן הלאה 3 פעמים
אז זה גם לא ענין של זמן אלא בעיה בקוד
לא משנה יש אולי פתרון אחר במקום ABORT??
יש אפשרות לשלוח משהו מהצד לקוח לדף PHP באמצע הטעינה שלו?
והדף יזהה את זה באותו הרגע, ואז אני יוכל להריץ קוד ובסיום DIE..
יש לי דף שאמור להיטען כלומר לקבל SLEEP בלולאה עד אשר הוא מוצא הודעות חדשות במסד..
אני רוצה שברגע שהמשתמש יתנתק כלומר יסגור את הדף (ABORT) אז השרת ידע לשלוח הודעה בהתאם..
בנוסף בחיפוש לקוחות לשיחה מתבצע אותו תהליך אשר סיומו תלוי בסגירת דף הלונג
לולאה אחת שעובד יתר על המידה יכולה להשפיע על חיבורי סרק
ובנוסף מאיטה את הניתוק ממשתמש שהתנתק קודם לכן
ולמה זה בעיה שהשרת עושה אקסטרה ריצה בלולאה ?
אז הוא יבין שהמשתמש התנתק חצי שניה אחרי.
יש לי קוד שאמור לחפש שותף לשיחה שנפתחה.
כלומר כל לולאה גוררת איתה חיפוש מחדש של שותף לשיחה
במידה והדף יסגר לולאה אחת לפני הלולאה בה יימצא השותף, יקבל השותף הודעה על חיבור עם משתמש שלמעשה הוא חיבור סרק
הבעיה נובעתאך ורק מלולאה נוספת שהתווספה לדף
צור משתנה חדש שנקרא האם מחובר.
חוץ מזה, חיפוש משתמשים חדשים אפשר לעשות סתם עם בקשת ajax. זה פעולה שקוראת פעם אחת ולא באמת מצריחה חיבור פתוח
עזוב את הנושא הזה לרגע..
אני רוצה רק להבין למה תמיד נדרש סיבוב נוסף כי אפילו אם שמתי לו SLEEP של 60 שניות עדיין הוא עובר פעמיים על הקוד
זאת אומרת שזה לא עניין של זמן אלא בעיה
ע"פ מה שאתה אומר PHP תמיד מחכה שיהיה לולאה נוספת ואז היא בודקת ABORT, מה מוסיפה הלולאה לבדיקה?
יכול להיות שעצם קריאה לWHILE קוראת מחדש לבדיקה נוספת?
אבל מה ההיגיון שהיא תעשה את זה כי אין פה בעיית זמן אלא הקוד בכוונה מחכה ללולאה השנייה..
מתוך הקוד מקור של PHP זה עובד ככה:
PHP מנסה להעביר לאפאצ'י את הפלט. אם אפאצ'י קיבל אותו - הכל בסדר, הקונקשן נחשב פתוח.
עם אפאצ'י לא קיבל אותו (כי אין לו לאן לשלוח אותו הלאה) - הקונקשן נחשב מנותק.
בגלל זה בדוקומנטציה כתוב שבשביל שהפונקציה הזות תעבוד - צריך לנסות לפלוט פלט כלשהו.
עכשיו למה פעמיים?
לא יודע, אבל אם אתה ממש רוצה לדעת - תוכל לעיין בקוד מקור של אפאצ'י.
בתור הנחה - יכול להיות שלאפאצ'י יש קאש פנימי כלשהו שעד שלא יתמלא - אפאצ'י בכלל לא מנסה לשלוח שום דבר ללקוח.
יכול להיות שאם תגדיל את
למשהו כמו
או מספר גדול יותר - אפאצ'י לא ישמור בבופר הפנימי שום דבר.
לא יודע עד כמה ההנחה הזאת נכונה. יכול להיות שסתם לאפאצ'י עצמו לוקח זמן להבין שהקונקשן נסגר
או שהפלט הראשון נשלח בכל מקרה, לא משנה אם יש יעד מאזין ורק הפלט השני לא.
ככה או ככה, כל זה אקטואלי רק לאפאצ'י ( שבו אתה כנראה משתמש).